package com.acmen.easyapi.parse;

import com.acmen.easyapi.annotation.ReqParam;
import com.acmen.easyapi.factory.impl.DefaultClassAliasFactory;
import com.acmen.easyapi.model.ReqParamNode;
import com.acmen.easyapi.util.ParamNameDiscoverer;
import com.acmen.easyapi.util.AnnotationUtil;
import com.acmen.easyapi.util.StringUtil;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.PathVariable;

import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;


/**
 * 接口详细说明表格工具
 *
 * @author acmen
 */
@Component
public class PathVariableParser {

    public List<ReqParamNode> createParamNodes(Method method) {
               List<List<Annotation>> parameterAnnotations = AnnotationUtil.getParameterAnnotations(method);  // 获取方法的参数注解列表
        String[] parameterNames = ParamNameDiscoverer.getParameterNames(method);  // 获取方法的参数名称数组
        Type[] parameterTypes = method.getParameterTypes();  // 获取方法的参数类型数组

        // 如果方法没有参数，则返回一个空列表
        if(parameterTypes.length==0){
            return new ArrayList<>();
        }

        List<ReqParamNode> paramNodes = new ArrayList();  // 创建一个用于存储参数节点的列表

        // 遍历方法的参数
        for(int idx = 0; idx<parameterTypes.length;idx++){
            PathVariable pathVar = AnnotationUtil.getAnnotation(parameterAnnotations.get(idx),PathVariable.class);  // 获取参数的 PathVariable 注解
            if(pathVar==null){
                continue;  // 如果没有 PathVariable 注解，则继续下一个参数的处理
            }

            Deprecated deprecated = AnnotationUtil.getAnnotation(parameterAnnotations.get(idx),Deprecated.class);  // 获取参数的 Deprecated 注解
            ReqParam reqParam = AnnotationUtil.getAnnotation(parameterAnnotations.get(idx),ReqParam.class);  // 获取参数的 ReqParam 注解

            ReqParamNode paramNode = new ReqParamNode();  // 创建一个用于存储参数信息的 ReqParamNode 对象

            Class parameterType = (Class)parameterTypes[idx];  // 获取参数的类型
            String paramName = StringUtil.isEmpty(pathVar.value()) ? pathVar.name() : pathVar.value();  // 获取参数的名称，如果 PathVariable 的 value 属性为空，则使用 name 属性，否则使用 value 属性

            // 如果参数名称为空，则使用方法的参数名称作为默认名称
            if(StringUtil.isEmpty(paramName)){
                paramName = parameterNames[idx];
            }

            paramNode.setName(paramName);  // 设置参数的名称
            paramNode.setDeprecated(deprecated!=null);  // 设置参数是否被标记为 Deprecated

            paramNode.setType(parameterType.getName());  // 设置参数的类型名称
            paramNode.setTypeAlias(DefaultClassAliasFactory.getAlias(parameterType));  // 设置参数类型别名

            paramNode.setRequired(pathVar.required()||reqParam!=null&&reqParam.required());  // 设置参数是否为必需参数，如果 PathVariable 的 required 属性为 true 或者 ReqParam 的 required 属性为 true，则为必需参数

            // 如果存在 ReqParam 注解
            if(reqParam!=null){
                paramNode.setLabel(reqParam.label());  // 设置参数的标签
                // 字符长度限制
                if(reqParam.maxLength()>0){
                    paramNode.setMaxLength(reqParam.maxLength());
                }
                // 数字最大限制
                if(reqParam.max()<Long.MAX_VALUE){
                    paramNode.setMax(reqParam.max());
                }
                // 数字最小限制
                if(reqParam.min()>-Long.MAX_VALUE){
                    paramNode.setMin(reqParam.min());
                }
                paramNode.addNote(reqParam.note());  // 添加参数的注释
                paramNode.setExample(reqParam.example());  // 设置参数的示例
            }

            paramNodes.add(paramNode);  // 将参数节点添加到参数列表中
        }
        // 返回参数节点列表
        return paramNodes;

    }
}
